package aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @author DJJ_F
 * @version 1.0
 * @date 2024/12/07
 * @description 自定义切面类 = 通知 + 切点
 */
// 表示是切面类
@Aspect
@Component
@Order(2)
public class LoginAspect {
    /*
    通知以方法的形式来展示
    在@Before()注解里写切面表达式
    切面 = 通知 + 切点
    */
    @Pointcut("execution(public * service.impl..*(..))")
    public void generalPointCut() {
        // 这个方法是一个标记，通用切点的标记，以实现代码复用，方法体不要写代码
    }
    // 使用通用切点时，直接写方法名，跨类要写包名
    @Before("generalPointCut()")
    public void loginCheck(JoinPoint joinPoint) {
        System.out.println("前置通知");
        // 提供连接点可以获得目标方法的信息
        System.out.println(joinPoint.getSignature().getName());
    }
    @AfterReturning("execution(public * service.impl..*(..))")
    public void afterReturning() {
        System.out.println("后置通知");
    }
    @Around("execution(public * service.impl..*(..))")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("前环绕通知");
        // 执行目标方法
        joinPoint.proceed();
        System.out.println("后环绕通知");
    }
    @AfterThrowing("execution(public * service.impl..*(..))")
    public void except() {
        System.out.println("异常通知");
    }
    @After("execution(public * service.impl..*(..))")
    public void after() {
        System.out.println("最终通知");
    }
}
